package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.dao.OrderSettingDao;
import com.itheima.exception.BusinessRuntimeException;
import com.itheima.pojo.OrderSetting;
import com.itheima.service.OrderSettingService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Slf4j
@Transactional
public class OrderSettingServiceImpl implements OrderSettingService {

    @Autowired
    OrderSettingDao orderSettingDao;

    /**
     * 1. 遍历集合 和数组 拿到每一行的数据
     * 2. 查询数据库 判断有没有相同日期的数据
     *        如果没有 直接添加
     *        如果有  判断她的已预约数是否小于新数据中的可预约人数
     *              如果不小于  报错 显示“已预约人数超出可预约人数 添加失败   web也要根据错误类型 打印message
     *              如果小于 正常修改
     *
     *  注意！！！方法必须加事务 绝不允许修改部分文件 如果一部分报错 直接回滚到插入前
     */
    @Override
    public void addOrderSettingList(List<OrderSetting> orderSettingsList) {
        if (orderSettingsList != null && orderSettingsList.size() > 0) {
            for (OrderSetting orderSetting : orderSettingsList) {
                saveOrEdit(orderSetting);
            }
        }

    }

    @Override
    public List<Map<String, Object>> findByMonth(String date) {
        List<OrderSetting> orderSettings = orderSettingDao.findByMonth(date);
        List<Map<String, Object>> maps = new ArrayList<>();
        for (OrderSetting orderSetting : orderSettings) {
            Date orderDate = orderSetting.getOrderDate();
            SimpleDateFormat sdf = new SimpleDateFormat("dd");
            String dd = sdf.format(orderDate);
            Map<String, Object> map = new HashMap<>();
            map.put("date",dd);
            map.put("number",orderSetting.getNumber());
            map.put("reservations",orderSetting.getReservations());
            maps.add(map);
        }
        return maps;
    }


    // 抽取出来的方法    判断传入的OrderSetting的日期是否存在与数据库
    //如果不存在 直接添加 如果存在 判断已预约是否大于可预约 如果不大于 直接修改 如果大于 报错
    public void saveOrEdit(OrderSetting orderSetting) {
        OrderSetting order = orderSettingDao.findByDateOrdersetting(orderSetting.getOrderDate());
        if (order != null) {
            if (order.getReservations() > orderSetting.getNumber()) {
                throw new BusinessRuntimeException("已预约人数超出可预约人数,不能修改！");
            }
            orderSettingDao.edit(orderSetting);
        } else {
            orderSettingDao.add(orderSetting);
        }
    }





}
